紐づいたモデルのデータをまとめて取得する

class TestController < ApplicationController
  def index
    @companys = Company.includes(:employees).all
  end
end
<table>
  <thead>
    <tr>
      <th>id</th>
      <th>名前</th>
      <th>従業員id</th>
      <th>従業員氏名</th>
    </tr>
  </thead>

  <tbody>
    <% @companys.each do |company| %>
      <% company.employees.each_with_index do |employee, index| %> 
        <tr>
          <% if index == 0 %>
            <td rowspan="<%= company.employees.count %>"><%= company.id %></td>
            <td rowspan="<%= company.employees.count %>"><%= company.name %></td>
          <% end %>
          <td><%= employee.id %></td>
          <td><%= employee.name %></td>
        </tr>
      <% end %>
    <% end %>
  </tbody>
</table>
includesを使用することで、紐づいたモデルのデータをまとめて取得し、パフォーマンスを改善することができます。
includesは記入しなくても動作しますが、紐づいたモデルのデータを取得するたびにクエリを発行してしまう(N+1)問題が発生します。
includesを使用すると、紐づいたデータをまとめて取得することができるため、N+1問題を解決することができます。

includesは
モデル.includes(:取得するモデルのフィールド).その他のメソッド

のような形式で記入してください。
複数のモデルのフィールドを取得したいときはincludesの引数を,区切りで増やすことができます。

上の例ではCompanyを1側、Employeeを多側としてincludesを使用しています。

紐づいたモデルのさらに先の紐づいたデータを集計するときは、
モデル.includes(取得するモデルのフィールド: :もう一つ先のフィールド)

のように記入します。

例えば、Employeeが1側でそれに多側のFamilyが紐づいていた場合は
Company.includes(employees: :families).all

のようになります。

さらにFamilyが1側でそれに多側のFavoriteが紐づいていた場合は
Company.includes(employees: {families: :favorites})

のように{}で入れ子にしていきます。